package br.com.ir.tcc.geco.service;

import java.util.Date;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.springframework.stereotype.Component;

import br.com.ir.tcc.geco.helper.PaginationHelper;
import br.com.ir.tcc.geco.modelo.Template;
import br.com.ir.tcc.geco.web.Message;

@Component
public class TemplateService extends GenericService{
	
	public TemplateService(){
		
	}
	
	/*Remove o modelo indicado pelo parametro*/
	public Message removerTemplate(Integer templateId){
		
		Object identity = null;
		
		try {
			identity = HibernateSession.createSession();
			Session session = HibernateSession.getSession();
			
			Template template = (Template) session.get(Template.class, templateId);
			session.delete("br.com.ir.tcc.geco.modelo.Template", template);
			session.flush();
		} catch (Exception e) {
			e.printStackTrace();
			return new Message("Ocorreu um erro ao tentar remover o template", Message.ERROR);
		}finally{
			closeSession(identity);
		}
		return new Message("O template foi removido com sucesso", Message.SUCCESS);
	}
	
	/*Carrega um modelo existente*/
	public Message loadTemplate(Integer templateId){
		Object identity = null;
		try {
			identity = HibernateSession.createSession();
			Session session = HibernateSession.getSession();
			Template template = (Template) session.get(Template.class, templateId);
			return new Message("O template foi carregado", Message.SUCCESS, template);
		} catch (Exception e) {
			e.printStackTrace();
			return new Message(e.getMessage(), Message.ERROR);
		} finally {
			closeSession(identity);
		}
	}
	
	/*Salva o modelo indicado*/
	public Message salvarNovoTemplate(Template template){
		Object identity = null;
		Transaction tx = null;
		
		try {
			identity = HibernateSession.createSession();
			Session session = HibernateSession.getSession();
			tx = session.getTransaction();
			tx.begin();
			tx.begin();
			template.setDataCriacao(new Date());
			session.save(template);
			session.flush();
			tx.commit();
			
			return new Message("O template foi salvo com sucesso", Message.SUCCESS);
		} catch (Exception e) {
			tx.rollback();
			e.printStackTrace();
			return new Message("Ocorreu um erro ao tentar salvar o template", Message.ERROR);
		}finally{
			closeSession(identity);
		}
	}
	
	/*Atualiza um modelo*/
	public Message atualizaTemplate(Template template) {
		Object identity = null;
		Transaction tx = null;
		
		try {
			if(template.getId() == null) {
				throw new Exception("O template informado ainda não foi salvo");
			}
			identity = HibernateSession.createSession();
			Session session = HibernateSession.getSession();
			tx = session.getTransaction();
			tx.begin();
			session.merge(template);
			session.flush();
			tx.commit();
			
			return new Message("O template foi atualizado com sucesso", Message.SUCCESS);
		} catch (Exception e) {
			e.printStackTrace();
			return new Message("Ocorreu um erro ao tentar atualizar o template", Message.ERROR);
		}finally{
			closeSession(identity);
		}
	}
	
	/* Busca todos os modelos cadastrados no sistema */
	@SuppressWarnings("unchecked")
	public List<Template> findAllTemplates(){
		try {
			List<Template> templates = null;
			templates = (List<Template>) findAll("br.com.ir.tcc.geco.modelo.Template");
			return templates;
		}catch(Exception e){
			e.printStackTrace();
		}
		return null;
	}
	
	/*Recupera uma página de resultados para Modelo*/
	public Message getPage(int page, int pageSize){
		try {
			List<Template> templates = findAllTemplates();
			PaginationHelper<Template> paginator = new PaginationHelper<Template>(templates, pageSize);
			Message msg = new Message();
			msg.setContent(paginator.getPage(page));
			return msg;
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	public Integer[] getPageRange(Integer pageSize){
		PaginationHelper<Template> paginator = new PaginationHelper<Template>(findAllTemplates(), pageSize);
		int total = paginator.getTotalPaginas();
		Integer[] range = new Integer[total];
		for(int i=0;i<total;i++){
			range[i] = i+1;
		}
		
		return range;
	}
	
	@SuppressWarnings("unchecked")
	public List<Template> searchTemplates(String text){
		Object identity = null;
		
		try {
			identity = HibernateSession.createSession();
			Session session = HibernateSession.getSession();
			
			List<Template> templates = null;
			Query q = session.createQuery("from Template template where 1=1 and lower(template.sigla) like lower(:text) and lower(template.descricao) like lower(:text) or lower(template.fonte) like lower(:text) ");
			q.setString("text", '%' + text + '%');
			templates = (List<Template>) q.list();
			
			return templates;
		}
		catch ( Exception e) { 
			e.printStackTrace();
		} finally {
			closeSession(identity);
		}
		
		return null;
		
	}
}
